Рядки в C++ (клас string)
Основи роботи з рядками в мові C++
В мові C++ для зручності з рядками створеноклас string, для використання якого необхідно підключити бібліотеку <string>.
Рядки можна оголосити і одночасно присвоїти їм значення:
string S1, S2 = "Hello";
Рядок S1 будет пустий, рядок S2 будет містити 5 символів.
До окремих символів рядка можна звертатися за індексом, як до елементів масиву або C-рядків. Наприклад S [0] - це перший символ рядка.
Для того, щоб дізнатися довжину рядка можна використовувати метод size() рядки. Наприклад, останній символ рядка S це S[S.size()-1].
Конструктори рядків
Рядки можна створювати з використанням наступних конструкторів:
string() - конструктор по замовчуванні (без параметров) створює пустий рядок.
string(string & S) - копия рядка S
string(size_t n, char c) - повторення символа c задане n разів.
string(size_t c) - рядок із одного символа c.
string(string & S, size_t start, size_t len) - рядок, містить не більше, ніж len символів данногорядка S, починаючи з символа номер start.
Конструктори можно викликати явно, наприклад, так:
S += string(10, 'z');
В цьому прикладі явно викликається конструктор string для скворення рядка, що містить з 10 символів 'z'.
Неявно конструктор вкликається при оголошенні рядка з вказанням додаткових параметрів. Наприклад, так:
string S(10, 'z');
Введення-виведення рядків
Рядок виводиться так само, як ы числові значення:
cout << S;
Для зитування рядка можна використовувати операцію ">>" для об'єкта cin:
cin >> S;
В цьому випадку зчитується рядок до пропуска. Це зручно коли потрібно рядок розбити на слова, або щоб читати дані до кінця файла за допомогою
while (cin >> S).
{
}Можна зчитувати рядки до появлення символа кынця рядка за допомогоюи функції getline. Сам символ кінця зчитується з вхідного потока, ала до рядка не добавляється:
getline(cin, S);
Арифметичені оператори
Із рядками можна виконувати наступні арифметичні операції:
= - присваивоєння значення.
+= - добавлення в кінець рядка інший рядок або символ.
конкатенація двух рядків, конкатенація рядка і символа.==, != - посимвольне порівняння.<, >, <=, >= - лексикографічесне порівняння.
Тобто якщо можна скопіювати зміст одного рядка в іншийза допомогою операції S1 = S2, порівнювати два рядки на рівність за допомогою S1 == S2, порівнювати в лексикографічному порядку за допомогою S1 < S2, або зробити додавання (конкатенацию) двохх рядків у вигляді S = S1 + S2.
Методи опрацювання рядків
У string є різні методи, багато з них можна використовувати декількома різними способами (з різним набором параметрів).
Розглянемо методи детальныше.
size
Метод size() визначає довжину рядка. Значення що повертається є беззнаковим типом (як і у всіх випадках, коли функція визначає значення, рівне тривалість строку або індексу елемента - ці значення беззнакові).Крім того, у string строк є метод length(), який також повертає довжину рядка.
resize
S.resize(n) - Змінює довжину рядка, нова довжина рядка стає n. При цьому рядок може бути як зменшений, так і збільшений. Якщо викликати метод у вигляді S.resize (n, c), де c - символ, для збільшення розміру строки додані символи будуть дорівнювати c.
clear
S.clear() - очищає рядок, рядок стає пустим.
empty
S.empty() - повертає true, якщо рядок пустий, false - якщо непустий.
push_back
S.push_back(c) - додає в кінець рядка символ c, викликається з одним параметром типу char.
append
Додає в кінець рядкаи кілька символів, другий рядок або фрагмент іншого рядка. Має багато способів виклику.
S.append(n, c) - додає в кінець рядка n однакових символів, равних с. n має цілочисельний тип, c - char.
S.append(T) - додає в кінець рядка S вміст рядка T. T може бути об'єктом класу string або C-рядком.
S.append (T, pos, count) - додає в кінець рядка S символи рядка T посинаючи з символа з індексом pos кількістью count.
erase
S.erase(pos) - видаляє з рядка S символи починаючи з індекса pos і до конца рядка.
S.erase(pos, count) - видаляє з рядка S починаючи з символа з індексом pos кількість count або до кінця рядка, якщо pos + count > S.size().
insert
Вставляє в середину рядка кілька символів, іншого рядка або фрагмент іншого рядка. Перший вставлений символ буде мати індекс i, і всі символи, здвигаються вправо.
S.insert (i, n, c) - вставити n одинакових символів, равних с. n цілий тип, c - char.
S.insert (i, T) - вставити рядок T. T може бути об’єктом класу string або C-рядком.
S.insert (i, T, pos, count) - вставити символи рядка T починаючи з символа з індексом pos кількістью count.
substr
S.substr(pos) - повертає підрядок цього рядка починаючи з символами з індексом pos і до кінця рядка.
S.substr (pos, count)- повертає підрядок цього рядка починаючи з символа з індексом pos кількістю count або до кінца рядка, якщо pos + count> S.size ().
replace
Замінює фрагмент рядка на інший фрагметн або рядок,
S.replace (pos, count, n, c) - вставити n одинакових символів, рівних с. n має цілий тип, c - char.
S.replace (pos, count, T) - вставити вміст рядка T. T може бути об'єктом класу string або C-рядком.
S.replace (pos, count, T, pos2, count2) - вставити символи рядка T починаючи з символа з індексом pos кількістьм count.
Детальніше про методи замінити.
find
Шукає в рядка перше входження іншого рядка. Повертає номер першого символа, починаючи з якого далі іде підрядок, що шукається. Якщо рядок не знайдено, то повернеться значення string::npos (= -1).
Якщо задано значення pos, то пошук починається з позицій pos. Якщо значення pos не вказане, то вважається рівним 0 - пошук здійснюється з початку рядка.
S.find(str, pos = 0) - шукати перше входіння рядка str починаючи з позиції pos. Якщо пос не задано - то начинна з початку рядка.
S.find (str, pos, n) - шукати в рядку підрядок, що дорівнює першим n символам рядка str. Значення pos повинно бути заданим.
rfind
Шукакє останнє входження підрядка ("правий" пошук). Способи виклика аналогічного способу виклика метода find.
find _ first _ of
Шукає в рядку перше входження будь-якого із символів цього рядка. Вповертає номер цього символа або значення string :: npos.
Якщо задано значення pos, то пошук починається з позицій pos.
####'find _ first _ not _ of'
Шукає в даному рядку перше входження символа, що відрізняється від символів рядка str. Способи ввклику і повернення значення аналогічні методу find _ first _ of.
// виводить позиції цифр в рядку та їх кількість
string s="1234567890";
string s1 ="hkjh4534hkj43kjh4k53h";
int k=0;
int t=0;
while(t!=-1)
{
t=s1.find_first_of(s,t+1) ;
if(t!=-1) cout<<t<<" ";
k++;
}find _ last _ not _ of
Шукає в даному рядку останнє входження символа, що відрізняється від символів рядка str. Способи ввклику і повернення значення аналогічні методу find _ first _ of.
c_str
Повертає вказівник на область пам'яті, в якій зберігаються символи рядка, возвращает значение типа char*. Возвращаемое значение можно рассматривать как C-строку и использовать в функциях, которые должны получать на вход C-строку.
char s[100]; string ss="abcd"; strcpy( s, ss.c_str() ); cout<<s<<endl;
stoi
Перетворює рядок в число
string s="123"; int n= s.stoi(s); cout<<n;
Стандартна бібліотека С++ також представляє ряд вбудованих функцій для роботи з символами. Вони пов'язані з перевіркою символів:
isupper(c): перевіряє, чи є даний символ великою літерою (літерою верхнього регістру), від "A" до "Z"
islower(c): перевіряє, чи є даний символ маленькою літерою (літерою нижнього регістру) від 'a' до 'z'
isalpha(c): перевіряє, чи є даний символ літерою алфавіту
isdigit(c): перевіряє, чи є даний символ цифрою от '0' до '9'
isxdigit(c): перевіряє, чи є даний символ літерою шістнадцятковою цифрою, від '0' до '9', от 'a' до 'f' або від 'A' до 'F'
isalnum(c): перевіряє, чи є даний символ алфавітно-цифровим символом; аналогічно isisalpha(c) || isdigit(c)
isspace(c): перевіряє, чи є даний символ пропуском (' '), символом переходом рядка ('\n'), повернення каретки ('\r'), переходом сторінки ('\f'), горизонтальна ('\t') або вертикальна ('\v') табуляція
isblank(c): перевіряє, чи є даний символ c пропуском (' ') або символом табуляції ('\t')
ispunct(c): перевіряє, чи є даний символ c символом пунктуації (один з наступних: _ { } [ ] # ( ) < > % : ; ? * + - / ^ & | ~ ! "=")
isprint(c): перевіряє, чи є даний символ c друкованим символом, який включає великі або маленькі літери,цифри, знаки пунктуації і пропуски
iscntrl(c): перевіряє, чи є даний символ c керуючим недрукованим символом
isgraph(c): перевіряє, чи є даний символ c графічним представленням
tolower(c): переводить символ c в нижній регістр
toupper(c): переводить символ c в верхній регістр